package com.lkl.utils;

import com.lkl.entity.Address;
import org.apache.commons.lang3.StringUtils;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Spider;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ProcessorUtil {


    /**
     *
     * @param page
     * @param cssName
     */
    public static void getData(Page page, String cssName) {
        //获取请求路径
        String url = page.getUrl().get();
        //父编码
        String code = url.substring(url.lastIndexOf("/") + 1, url.indexOf(".html"));
        String parent;
        //其他地区数据处理
        if (!"index".equals(code)) {
            //不是根路径，统一编码为12位，不足填充0
            parent = StringUtils.rightPad(code, 12, '0');
            orderData(page,cssName,parent);
        } else {
            //省级数据处理
            parent = "";
            mainData(page,cssName,parent);
        }
        //获取所有字链接并去重
        List<String> httpUml = page.getHtml().css(cssName + " td a").links().all()
                .stream()
                .distinct()
                .collect(Collectors.toList());
        //有子链接，继续爬虫
       if (httpUml.size() > 0) {
            getPage(httpUml);
       }
    }

    /**
     * 处理主要的数据，省级数据
     *
     * @param page page对象
     * @param s css选择器字符串
     * @param parentCode 父编码
     */
    public static void mainData(Page page, String s, String parentCode) {
        List<String> all = page.getHtml().css(s + " td").all();
        List<Address> list = new ArrayList<>();
        all.forEach(html -> {
                    Address address = new Address();
                    //获取编码
            String code = (html.substring(html.indexOf("=\"") + 1, html.indexOf("."))).replace("\"", "");
            address.setCode(StringUtils.rightPad(code, 12, '0'));
            //获取地区名称
            String name = (html.substring(html.indexOf("\">") + 1, html.indexOf("<b"))).replace(">", "");
            address.setName(name);
            address.setParentCode(parentCode);
            list.add(address);
        });
        //写入文件
//        FileUtils.write2Data(list);
        FileUtils.write2File(list);
    }
    /**
     * 处理其他的数据，不是省级数据
     *
     * @param page page对象
     * @param s css选择器字符串
     * @param parentCode 父编码
     */
    public static void orderData(Page page, String s, String parentCode) {
        //获取所有td
        List<String> all = page.getHtml().css(s).all();
        List<Address> list = new ArrayList<>();
        all.forEach(html -> {
            Address address = new Address();
            //设置父编码
            address.setParentCode(parentCode);
            //有a标签
            //<tr class="countytr">
            // <td><a href="01/110101.html">110101000000</a></td>
            // <td><a href="01/110101.html">东城区</a></td>
            //</tr>
            String[] split = html.split("<td>");
            if (html.contains("a>")) {
                //获取编码
                String value = split[1].substring(split[1].indexOf("\">") + 1, split[1].indexOf("</a")).split(">")[1];
                address.setCode(value);
                //获取名称
                String text = split[2].substring(split[2].indexOf("\">") + 1, split[2].indexOf("</a")).split(">")[1];
                address.setName(text);
            } else {
                //没有a标签
                //<tr class="villagetr">
                // <td>653124201200</td>
                // <td>111</td>
                // <td>巴格艾日克村委会</td>
                //</tr>
                //为5 乡级地区
                if (split.length == 4) {
                    address.setCode(split[1].substring(0, split[1].indexOf("<")));
                    address.setName(split[3].substring(0, split[3].indexOf("<")));
                } else {
                    address.setCode(split[1].substring(0, split[1].indexOf("<")));
                    address.setName(split[2].substring(0, split[2].indexOf("<")));
                }
            }
            list.add(address);
        });
        //写入数据
//        FileUtils.write2Data(list);
        FileUtils.write2File(list);
    }
    /**
     * 多线程爬虫
     *
     * @param urlList
     */
    public static void getPage(List<String> urlList) {
        //设置爬虫的网站
        Spider spider = Spider.create(new JobProcessor());
        spider.addUrl(urlList.toArray(new String[0]));
        //通过线程池运行
        ThreadPoolService.newTask(spider);
        //记录页面总数
        JobProcessor.pageTotal += urlList.size();
    }
}
